package com.dylan.历史.java8.lambda表达式;

//import javafx.event.ActionEvent;
//import javafx.event.EventHandler;
import org.junit.Test;

import java.util.Arrays;
import java.util.function.Function;

/**
 * Created by Dylan on 2018/7/1.
 * lambda基本语法
 *
 * Java中不能向其他代码传递一段代码,由于Java是面向对象的语言,因此你不得不构建一个属于某个类的对象,由它的某个方法来包含所需的代码.
 *
 * 1.一个lambda表达式是一个带有参数的代码块
 * 2.想要在以后某个时间点执行的代码块,可以使用lambda表达式
 * 3.lambda表达式可以被转换为函数式接口
 * 4.lambda表达式可以在闭包作用域中有效地访问final变量
 * 5.永远不需要为一个lambda表达式指定返回类型,它总是会从上下文中被推导出来
 */
public class 基本语法 {

    @Test
    public void test1() {
        String[] arr = new String[]{"beijing", "shenzhen", "hebei", "shanghai", "dalian"};
        // 使用lambda表达式进行排序
        Arrays.sort(arr, (String first, String second) -> Integer.compare(first.length(), second.length()));

        // 如果表达式内容复杂,不能用一行表示,则可以用编写方法的方式来编写,即用{}
        Arrays.sort(arr, (String first, String second) -> {
            if (first.length() < second.length()) {
                return  -1;
            } else if (first.length() > second.length()) {
                return 1;
            } else {
                return 0;
            }
        });

        // 如果一个lambda表达式的参数类型是可以被推导的,那么就可以省略它们的类型
        Arrays.sort(arr, (first, second) -> Integer.compare(first.length(), second.length()));

        // 如果lambda表达式没有参数,可以提供一对小括号,如同不含参数的方法那样
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println(i);
            }
        }).start();

        // 如果方法只有一个参数,并且参数的类型可以被推导出来,则可以省略小括号
//        EventHandler<ActionEvent> listener = event -> System.out.println("谢谢点击!");
    }
}
